package com.tyl.shiro.config;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    /*
    * 创建三部曲
    * */

    //3、ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("SecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        /*配置拦截器拦截，有以下方式：
        * anon:无需认证就可以访问
        * authc：必须认证了才能访问
        * user：必须拥有记住我功能才可以访问
        * perms：对有某个资源的权限才可以访问
        * role：拥有某个角色的权限才可以访问
        * */
        // filterMap.put("/user/add","authc");
        // filterMap.put("/user/update","authc");
        //拦截
        Map<String, String> filterMap=new LinkedHashMap<>();
        //支持通配符
        filterMap.put("/user/add","perms[user:add]");
        filterMap.put("/user/update","perms[user:update]");
        filterMap.put("/user/*","perms[user:]");
        //授权
        filterMap.put("/user/*","authc");
        //设置过滤器
        bean.setFilterChainDefinitionMap(filterMap);
        //设置登录请求
        bean.setLoginUrl("/toLogin");

        //设置权限请求
        bean.setUnauthorizedUrl("/authc");

        return  bean;
    }
    // 2、DefaultWebSecurityManager

    @Bean(name = "SecurityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        // DefaultWebSecurityManager跟UserRealm需要关联起来，通过springboot给他
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }
    // 1、创建realm对象，需要自定义
    @Bean(name ="userRealm")//(name ="userRealm")也可以不要，直接使用方法名传过去
    public  UserRealm userRealm(){
        UserRealm userRealm = new UserRealm();
        return userRealm;
    }
}
